package com.iot.hmi.service;

import com.iot.hmi.entity.*;
import com.iot.hmi.pojo.IotItemVO;
import com.iot.hmi.pojo.LatestValueVO;
import com.iot.hmi.protocol.AbstractProtocol;
import com.iot.hmi.protocol.ProtocolHandler;

import java.sql.SQLException;
import java.util.List;

public interface HmiApiService {

    /**
     * 保存设备和明细
     *
     * @param device 设备
     * @param items  明细
     * @throws SQLException SQLException
     */
    void saveDeviceAndItems(IotDevice device, List<IotDeviceItem> items) throws SQLException;

    /**
     * 保存明细配置和工艺
     *
     * @param config      配置
     */
    void saveItemConfig(
            String host, Integer port, String address,
            IotItemConfig config
    ) throws SQLException;

    /**
     * 获取明细配置和工艺
     *
     * @param host    主机地址
     * @param port    端口
     * @param address 明细地址
     * @return IotItemVO
     */
    IotItemVO getItemConfig(String host, Integer port, String address) throws SQLException;

    /**
     * 获取设备最新数据
     *
     * @param host 主机地址
     * @param port 端口
     * @return List<LatestValueVO>
     */
    List<LatestValueVO> listLatestValue(String host, Integer port) throws SQLException;

    /**
     * 获取明细列表
     *
     * @param host 主机地址
     * @param port 端口
     * @return List<IotDeviceItem>
     * @throws SQLException SQLException
     */
    List<IotDeviceItem> listItems(String host, Integer port) throws SQLException;

    /**
     * 获取当前明细今天的数据
     *
     * @param protocolHost 主机地址
     * @param protocolPort 主机端口
     * @param itemAddress  明细地址
     * @param startTime    开始时间 -> yyyy-MM-dd HH:mm:ss
     * @param endTime      结束时间 -> yyyy-MM-dd HH:mm:ss
     * @return List<IotItemValue>
     * @throws SQLException SQLException
     */
    List<IotItemValue> listValueByTimeRange(
            String protocolHost, Integer protocolPort, String itemAddress,
            String startTime, String endTime
    ) throws SQLException;

    /*
     * Note: 关于协议采集方法的使用
     * IotDevice dev = new IotDevice();
       dev.setProtocolHost("10.77.54.252");
       dev.setProtocolPort(502);
       dev.setProtocolType("ModbusTCP");
       HmiApiService service = new HmiApiServiceImpl();
       * 获取协议连接对象
       * 可以判断协议连接是否成功：protocol.isConnected()
       * 如果连接不成功就提示，无需调用读取数据方法
       * 连接成功再调用协议数据读取方法
       final AbstractProtocol protocol = service.protocolConnect(dev);
       final List<IotDeviceItem> items = 前端传入明细列表;
       * 协议数据读取
       final ProtocolHandler handler = service.startShader(protocol, items, 5);
       * 协议的关闭
       handler.closeShader();
       protocol.disConnect();
     */

    /**
     * 连接协议
     *
     * @param device IotDevice
     * @return AbstractProtocol
     */
    AbstractProtocol protocolConnect(IotDevice device);

    /**
     * 开启采集
     *
     * @param protocol    AbstractProtocol
     * @param deviceItems 采集明细
     * @param period      采集间隔
     * @return ProtocolHandler
     */
    ProtocolHandler startShader(AbstractProtocol protocol, List<IotDeviceItem> deviceItems, Integer period);

}
